package com.imooc.miaosha.result;

import lombok.Getter;
import org.springframework.util.StringUtils;

/**
 * 模块描述: <br>
 * (全局返回值)
 *
 * @Author: Mr. xyb
 * @Date: 2019/4/14 14:12
 * @since: 1.8.0
 * @version: 1.0.0
 */
@Getter
public class Result<T> {
    /**
     * 返回码
     */
    private int code;

    /**
     * 返回信息
     */
    private String msg;

    /**
     * 返回数据
     */
    private T data;

    private Result(T data) {
        if (data == null) {
            return;
        }
        this.data = data;
    }

    private Result(CodeMsg codeMsg) {
        if (codeMsg == null) {
            return;
        }
        this.msg = codeMsg.getMsg();
        this.code = codeMsg.getCode();
    }

    private Result(T data, String msg) {
        this.data = data;
        this.msg = msg;
    }

    /**
     * 成功返回
     *
     * @param <T>
     * @return
     */
    public static <T> Result<T> success(T data) {
        return success(data, "响应成功");
    }

    /**
     * 返回成功 包含响应文字和数据
     *
     * @param data 需要返回的数据
     * @param msg  返回的文字
     * @param <T>
     * @return
     */
    public static <T> Result<T> success(T data, String msg) {
        if (StringUtils.isEmpty(msg)) {
            msg = "响应成功";
        }
        Result<T> result = new Result<>(data, msg);
        return result;
    }

    /**
     * 返回成功 参数为自定义枚举
     *
     * @param resultEnums
     */
    public static <T> Result<T> success(ResultEnums resultEnums) {
        CodeMsg codeMsg = new CodeMsg(resultEnums.getCode(), resultEnums.getMsg());
        Result<T> success = success(codeMsg);
        return success;
    }

    /**
     * 返回成功 自定义codeMsg
     *
     * @param <T>
     * @return
     */
    public static <T> Result<T> success(CodeMsg codeMsg) {
        Result<T> result = new Result<>(codeMsg);
        return result;
    }

    /**
     * 失败返回
     *
     * @param codeMsg
     * @param <T>
     * @return
     */
    public static <T> Result<T> error(CodeMsg codeMsg) {
        if (StringUtils.isEmpty(codeMsg.getMsg())) {
            codeMsg.setMsg("访问失败");
        }
        return new Result<T>(codeMsg);
    }

    public static <T> Result<T> error() {
        return new Result<T>(new CodeMsg(ResultEnums.SERVER_ERROR));
    }

    public static <T> Result<T> error(ResultEnums resultEnums) {
        CodeMsg codeMsg = new CodeMsg(resultEnums.getCode(), resultEnums.getMsg());
        return new Result(codeMsg);
    }
}
